import { MessagePlugin } from 'tdesign-react'
// import { clearStore } from '@/stores'
import axios from 'axios' // 也是请求接口的一个依赖，类似于 fetch
import * as uuid from 'uuid' // 这是一个 uuid 的依赖，避免304 接口请求
// 这里的两个依赖都是第三方依赖，所以需要安装一下
axios.defaults.withCredentials = true

// 这里 ...config 其实是新构建了一个对象，把里面的值都放到 config 对象里面
const ApiRequest = ({ ...config }): Promise<ResponseDataType> => {
  const {
    api: {
      url = '',
      method = 'POST',
      description = '', // 这里等晚上再跟你讲解一下
      useElseProxy = false
    },
    params = {}, // 这里如果变成了 params1 外面应该怎么传值
    // method = 'POST',
    headers = undefined,
    successCallback = () => { },
    errorCallback = () => { }
  } = config

  if (!url) { // 如果没有 url, 那么就提示，找不到请求
    return new Promise((resolve, reject) => {
      resolve({
        code: -1,
        data: [],
        note: '[Error] Connot found request url: ' + url,
        total: -1,
      })
    })
  }

  // 这是请求的参数
  let requestParams: any = {
    method, // 请求方法，默认 POST
    url: !useElseProxy ? '/api' + url : url, // 请求链接
    headers: Object.assign({ 'Content-Type': 'application/json' }, headers ? {
      ...headers,
    } : {
      "Accept": 'application/json',
      'Content-Type': 'application/json;charset=utf-8',
      'x-request-uuid': uuid.v4(),
    }),
    cerdentials: 'include',
    // data: params, // 请求参数
    timeout: 20000, // 最大延迟 20s,
    timeoutErrorMessage: '连接超时，请稍后再试！', // 超时消息提示
    // mode: 'cors', // 是否跨域
  }

  // 处理b站请求风控问题
  if (url.indexOf('blapi') > -1) {
    requestParams.headers = {
      ...requestParams.headers,
      "Cookie":params.cookie,
      // "Cookie": encodeURIComponent("buvid3=831FE83E-ADEA-41DD-BCDD-5159F9CB903698213infoc; b_nut=1736668698; enable_web_push=DISABLE; home_feed_column=5; browser_resolution=2036-993; buvid4=D71A9300-5657-8148-7A79-CF977883CCA799378-025011207-71HgfdojuyvBUF1DKdVR0A%3D%3D; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzcwMDcxOTEsImlhdCI6MTczNjc0NzkzMSwicGx0IjotMX0.PcihJRJ8ZiMQva-NXTKxFOdvpLPEG-My642ASHSbGH0; bili_ticket_expires=1737007131; header_theme_version=CLOSE; CURRENT_FNVAL=4048; rpdid=|(u)~JY)~lm~0J'u~JYYY))YR; SESSDATA=ba41e4ae%2C1752287404%2C704df%2A12CjB3v7B55FXNg4aRKcN3FvPNrI3J8NMKask_VH0H6QrmP81pYRo9SrgtzYAsYekD6GsSVjJxbk5TUnBCZXM5eDRvSkZJazJIVERGOXJrbWZtN3VOeFlFOU5sR2tJLXBfeXFfOFJQOThrVmZLZjdTUkJxUnBkbXdwcGZSSTVJQndPd0ROTzBRUDJBIIEC; bili_jct=a64347d12d585801f65bbd7c62b9396f; DedeUserID=8220922; DedeUserID__ckMd5=ed249f85ec73ddce; sid=4takg31i; bp_t_offset_8220922=1022221664059916288; bsource=search_bing"),
      // 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
      // "Referer": 'https://www.bilibili.com/' // 对于直接浏览器调用可能不适用
    }
  }

  if (method === 'GET') {
    requestParams.params = params
  } else {
    requestParams.data = params
  }

  // 这里是调用接口的地方（也是核心的代码），使用了一个 _____ promise
  return new Promise<ResponseDataType>((resolve, reject) => {
    // 里面是一个 axios 方法，也是一个 promise.
    axios(requestParams).then((response: any) => {
      resolve(response.data) // 当一切正常的时候就正常返回数据
      successCallback(response)
    }).catch((error: any) => { // catch 捕获异常，这是有问题的时候就报错
      reject({ message: '请求失败', error: error.code + ': ' + error.message })
      errorCallback(error)
    })
  })
}

export default ApiRequest
